package com.stm.web.controller.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Auther: ll
 * @Date: 2018/12/15 11:53
 * @Description: websocket
 */
@Slf4j
@ServerEndpoint("/websocket/{pageCode}")
@Component
@Scope("prototype")
public class WebSocket {

    // concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话，可以使用Map来存放，其中Key可以为用户标识
    public static Map<String, Session> electricSocketMap = new ConcurrentHashMap<String, Session>();

    /**
     * 连接建立成功调用的方法
     *
     * @param session 可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(@PathParam("pageCode") String pageCode, Session session) {
//        Session sessions = electricSocketMap.get(pageCode);
//        if (null == sessions) {
//            Session sessionList = new ArrayList<Session>();
//            sessionList.add(session);
            electricSocketMap.put(pageCode, session);
//        } else {
//            sessions.add(session);
//        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("pageCode") String pageCode, Session session) {
//        if (electricSocketMap.containsKey(pageCode)) {
            electricSocketMap.remove(pageCode);
            log.info("删除session成功！参数为："+pageCode+"session为："+session.toString());
            log.info("session数量为："+electricSocketMap.size());
//        }
    }

    /**
     * 后端主动向前端发送消息
     *
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    public void sedMessage(String message, Session session) {
    	log.info("websocket发送消息:*******************" + message+"url："+session.getRequestURI());
    	try {
    		synchronized (session){
    			session.getBasicRemote().sendText(message);
    		}
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }
    
    
    
    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    @OnMessage
    public void onMessage(String message, Session session) {
    	log.info("websocket收到消息:*******************" + message+",url："+session.getRequestURI());
//        try {
//        	 synchronized (session){
//        		 session.getBasicRemote().sendText(message);
//        	 }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
    }
    
    /**
     * 广播信息
     * @param message
     * @return
     */
    public boolean sendMessageToAllUsers(String message , Session session) {
        boolean allSendSuccess = true;
//        for (Session session : sessions) {
            try {
              	 log.info("session*******************"+session.toString());
            	 session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
                allSendSuccess = false;
//            }
        }
        return  allSendSuccess;
    }
    
    /**
     * 发生错误时调用
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
    	log.info("发生错误");
    }




}
